/* =============================================================================
 * PROJET           	: Matrices creuses
 * NOM DU FICHIER   	: Sat.c
 * OBJET            	: Programe principal du projet (Chargement du probleme dans 
 *							: une matrice, et appel de la fonction de resolution)
 * -----------------------------------------------------------------------------
 * DATE DE CREATION 	: 17/04/2009
 * AUTEUR           	: Ivan VALIMAHAMED, Sha LIU, Yves BOGE
 * -----------------------------------------------------------------------------
 * MODIFICATIONS (   n) date - auteur - description )
 * ============================================================================= */


#include "Chargement.h"

#define FICHIER_DEFAUT "test.txt"


/*
 *	NOM 			: Main
 *	ENTREES 		: Arguments standards de la ligne de commande
 *	SORTIES		: Affichage du resultat de la resolution
 *	BUT			: Resoudre un probleme de type SAT
 *					: Prend en argument le nom du fichier contenant les equations
 *					: comprend les options -h, -t, et -m
 *					: Si aucun argument n'est precise, le programme tente de charger
 *					:	le fichier "test.txt"
 */

int main (int argc , char* argv[])
{
	FILE* Fich_matrice = NULL;
	t_Matrice Mat;
	int i;
	bool Resolu, Aide = false, Trace = false, Matrice = false;
	int Fichier = 0;				/* numero de l'argument contenant le dernier fichier passe en parametre */
	
	
	/* On recupere les arguments de la ligne de commande */
	for ( i = 1 ; i < argc ; i++ )
	{
		if ( argv[i][0] == '-' )		/* il s'agit d'une option */
		{
			/* Si l'option fait plus de deux caractere, alors elle est incorrect */
			if ( strlen(argv[i]) > 2 )
				Aide = true;
			else
			{
				switch ( argv[i][1] )
				{
					case 't' :
						Trace = true;
						break;
					
					case 'm' :
						Matrice = true;
						break;
					
					default :
						Aide = true;
				}
			}
		}
		else									/* il s'agit d'un nom de fichier */
			Fichier = i;
	}

	/* Si l'un des arguments est incorrect ou si l'utilisateur demande l'aide du programme : */
	if ( Aide )
	{
		printf("\n\t\t\t%s : Resolution de problemes SAT\n\n", argv[0]);
		printf("usage :\n\t%s [-h, -t, -m] [fichier contenant le probleme]\n\n", argv[0]);
		printf("options : (Les options doivent etre separes par des espaces)\n\t-h :\taffiche cette page d'aide\n");
		printf("\t-t :\tactive le mode trace (detaille du processus d'execution)\n");
		printf("\t-m :\tactive l'affichage de la matrice a chaque etape de la resolution\n\n");
		printf("fichier :\tfichier contenant le systeme d'equations a resoudre \n");
		printf("\t\t- si aucun fichier n'est precise, on ouvre le fichier\n\t\t  test.txt\n");
		printf("\t\t- si plusieurs fichier sont precise, on ouvre le dernier\n");
		printf("remarque :\n\t\t- L'utilisation des options trace et matrice multiplie\n\t\t  le temps d'execution avec un facteur 30.\n");
		printf("\t\t- l'ordre des arguments n'a aucune importance\n");
		printf("\t\t- l'affichage de la matrice sera illisible au dela d'un certain\n");
		printf("\t\t  nombre de variables dependant de la resolution de votre ecran.\n");
		printf("\t\t- Toute option incomprise affichera cette page d'aide.\n\n");
	}
	else
	{
		/* Si un fichier a ete passe en argument, on l'ouvre */
		if ( Fichier != 0 )
			Fich_matrice = fopen(argv[Fichier], "r");
		else	/* Sinon, on ouvre le fichier par defaut */
			Fich_matrice = fopen(FICHIER_DEFAUT, "r");

		if (Fich_matrice != NULL)
		{
			Mat = Get_matrice(Fich_matrice);
			
			/* On appel la procedure Resolution selon les options demandes */
			Resolu = Resolution(&Mat, (int) Trace, (int) Matrice);

			if ( Resolu )
				printf("\nLe probleme a ete resolu avec les valeurs suivantes :\n");
			else
				printf("\nLe probleme n'a pas ete resolu. Les dernieres valeurs sont :\n");

			for ( i = 0 ; i < Mat.Nb_var ; i++ )
			{
				printf("X%d : %d ; ", i + 1, Mat.Var[i].Valeur);
			}
			printf("\n");
			Put_fonction_reduite(&Mat);
			Put_infos_matrice (&Mat);
			fclose(Fich_matrice);
		}
		else
		{
			printf("Impossible d'ouvrir le Fichier (Taper %s -h pour l'aide)\n", argv[0]);
		}
	}
	
	return EXIT_SUCCESS;
}
